package edzest.basic;

import java.util.Scanner;

public class J09_Exception {

	public static void main(String[] args) throws Exception  {
		int num1, num2, result;
		Scanner sc = new Scanner(System.in);
		// 예외 처리
		// 프로그램에서 오류error의 종류
		// 1. compile-time error
		//		오타 등의 잘못된 코드 작성이 원인
		// 		개발자가 충분히 수습가능
		// 2. runtime-time error
		//		프로그램 실행시 발생하는 오류
		//		논리적 오류(개발자 수습가능)
		//		잘못된 동작이나(개발자 수습가능) 
		//		특별한 상황(개발자 수습불가)이 원인
		//		네트워크 프로그래밍에서 DB가 죽었거나
		//		저장할 공간이 없거나
		
		//	따라서 예외는 프로그램 실행 중
		// 발생하는 오류를 개발자가 처리하기 위해
		// 코드로 작성하는 조치사항을 의미
		// 이것을 통해 오류로 인한 프로그램 실행
		// 중단을 막을 수 있음
		
		// 예외 : checked exception, unchecked exception
		
		
		
		// 상황1) 두 개의 정수를 입력받아
		//		두수를 나눈 결과를 출력하는 프로그램 작성
		
		/*System.out.println( "두 수는?" );
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		result = num1 / num2; 
		// num2에 0이 입력되면 중단되고 아래 코드 실행 안됨
		System.out.println("두수를 나눈 결과는 " + result);*/
		
		/*System.out.println( "두 수는?" );
		num1 = sc.nextInt();
		num2 = sc.nextInt();
		if( num1 == 0 || num2 == 0){
			System.out.println("0은 입력할 수 없습니다");
		}else{
			result = num1 / num2;
			System.out.println("두수를 나눈 결과는 " + result);
		}*/
		// 오류가 발생할 조건을 if문으로 막음
		// 오류 발생 조건이 많을 경우 다중 if문을
		// 사용해야 하는데 그러면 코드가 복잡해짐
		
		/*System.out.println( "두 수는?" );
		try{
			num1 = sc.nextInt();
			num2 = sc.nextInt();
			result = num1 / num2;
			System.out.println("두수를 나눈 결과는 " + result);
		}catch(Exception ex){
			System.out.println("입력값은 숫자이고 0 이상입니다!");
		}*/
		// 자바에서는 오류발생시 예외 exception처리
		// 매커니즘을 사용함
		// 오류가 발생할 가능성이 있는 코드들
		// try - catch 블럭으로 지정하고
		// catch 에서 오류에 대한 조치사항을 작성
		 
		System.out.println( "두 수는?" );
		try{
			num1 = sc.nextInt();
			num2 = sc.nextInt();
			sc.close();
		}catch(Exception ex){
			throw new Exception("잘못된 수를 입력했습니다");
			// Unhandled exception type Exception 
			// 던지는 예외를 받아줄 녀석이 없다는 뜻
			// 메인 옆에 throws Exception을 해서해결
			
			// 값 입력시 발생하는 예외를
			// 각각의 catch 블럭에서 처리하지 않고
			// 한곳에 모아서 처리하기 위해
			// throws 라는 명령으로 예외를
			// 다른 곳으로 넘김
		}
		try{
			result = num1 / num2;
			System.out.println("두수를 나눈 결과는 " + result);
		}catch(Exception ex){
			throw new Exception("잘못된 연산을 시도했습니다");
		}
		
		// sc.close(); 
		// 여기다 쓰니까 Resource leak: 'sc' is not closed at this location
		
	}

}
